Skip to content

fix(dedup): Intra-Run-Sibling-Dedup (Befund D)#64

Merged
TillQuandel merged 2 commits into
masterfrom
fix/sibling-dedup
Jun 23, 2026
Merged

fix(dedup): Intra-Run-Sibling-Dedup (Befund D)#64
TillQuandel merged 2 commits into
masterfrom
fix/sibling-dedup

Conversation

@TillQuandel

Copy link
Copy Markdown
Owner

Problem (Befund D)

Zwei Near-Dup atomic Notes aus EINEM Lauf werden nicht gemergt. cross_reference erkennt das Dup bereits (dup_risk=high) und setzt action=extend + extend_path=<Sibling-Titel> — aber der Sibling ist eine Draft desselben Laufs, keine Vault-Datei. write_note routet Merge-vs-Vollnote ausschließlich über find_existing_in_vault(title, aliases, …) und liest extend_path gar nicht → das Signal verpufft, beide Notes werden als Vollnoten geschrieben.

Die drei bestehenden Dedup-Schichten verfehlen es: dedup_exact (nur exakte Titel), entity_resolution Stage-1-Blocking (filtert disjunkt-betitelte Near-Dups bewusst raus, um echte Geschwister zu schützen), cross_reference (läuft ins Leere, s.o.).

Fix

Neue deterministische Stage resolve_sibling_dups(drafts, existing_concepts) nach den per-Draft-Calls und vor dem Writer. Wertet das vorhandene extend-Signal aus — kein Eingriff ins Title-Blocking, kein neuer Body-Cosine-Pass, kein zusätzlicher LLM-Call.

  • Union-Find-Cluster über Intra-Run-extend-Kanten (Paare/Ketten/Zyklen)
  • Survivor: höchster critic_score, Tie → längerer Body → norm-Titel (ordnungsunabhängig)
  • verlustarm: related + source_anchors + gedroppte Titel als Aliase wandern in den Survivor (gedroppte [[…]]-Links lösen via Alias auf, kein Dead-Link)
  • Vault-Erhalt: hat ein Cluster-Member eine reale Vault-Dublette, erbt der Survivor sie

Tests (TDD)

10 Tests in test_sibling_dedup.py: Paar / Kette A→B→C / Zyklus A↔B / Vault-Propagation / bare-Titel-mit-Slash / ordnungsunabhängiger Tiebreak / Heading-Self-Link / kein-False-Positive-bei-Vault-Extend / Noop. Volle Suite: 603 passed.

Cross-Model-Review

  • Codex (codex-cli 0.141.0): HIGH#2 Vault-Extend-Verlust, MED#4 Slash-Titel-Matching, LOW Tiebreak-Determinismus + Heading-Self-Links — alle adressiert.
  • Mistral (magistral-medium): Survivor-eigenes-Vault-Ziel-Vorrang — adressiert.
  • Jeder Fang per Test gegen die Pipeline-Realität verifiziert (Union, nicht Voting).

Tilltime added 2 commits June 23, 2026 08:35
cross_reference setzt bei dup_risk=high action=extend + extend_path=<Sibling-Titel>.
Zeigt das auf einen Draft DESSELBEN Laufs (keine Vault-Datei), verpufft das Signal
beim Writer (write_note routet nur ueber find_existing_in_vault, nicht ueber
extend_path) und beide Near-Dups werden als Vollnoten geschrieben. Neue Stage
resolve_sibling_dups() wertet das vorhandene Signal aus und kollabiert Geschwister
eines Laufs deterministisch zu EINER Note - ohne Eingriff ins Title-Blocking von
entity_resolution (kein False-Positive-Risiko).

- Union-Find-Cluster ueber Intra-Run-extend-Kanten; Survivor = hoechster critic_score
  (Tie: laengerer Body, dann norm-Titel -> ordnungsunabhaengig deterministisch)
- verlustarm: related + source_anchors + gedroppte Titel als Aliase in den Survivor
- Vault-Erhalt: Survivor erbt eine reale Vault-Dublette eines Cluster-Members
- 10 Tests: Paar/Kette/Zyklus/Vault-Propagation/Slash-Titel/Tiebreak/Heading/No-FP

Cross-Model-Review: Codex (HIGH#2 Vault-Loss, MED#4 Slash-Match, LOW Tiebreak/Heading)
+ Mistral (Survivor-Vault-Vorrang) - alle adressiert + TDD-abgesichert.
Zwei Near-Dup-Drafts mit dem realen cross_reference-Signal (B.action=extend,
extend_path=<A-Titel>) ergeben nach resolve_sibling_dups + write_note GENAU eine
Note-Datei (ohne Fix zwei verschiedene Slugs). Deterministische Akzeptanz-Evidenz,
da der reale Ebner-Lauf das Near-Dup-Paar stochastisch nicht reproduzierte.
@TillQuandel TillQuandel merged commit 98aec51 into master Jun 23, 2026
2 checks passed
@TillQuandel TillQuandel deleted the fix/sibling-dedup branch June 23, 2026 10:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants